package utils;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

import java.io.File;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;

/**
 * 二维码工具
 *
 * @since 2011-07-06
 * @author zhangzc@djcars.cn
 */
public class QRUtil {

	/**
	 * 生成二维码到文件
	 * 
	 * @param contents 二维码内容
	 * @param width 最大宽度
	 * @param height 最大高度
	 * @param encoding 内容编码
	 * @param imgType 图片类型
	 * @param imgPath 图片路径
	 * @return
	 */
	public static boolean generateToFile(String contents, int width, int height, String encoding, String imgType,
			String imgPath) {
		Map hints = new HashMap();
		// 指定纠错等级
		hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.Q);
		// 指定编码格式
		hints.put(EncodeHintType.CHARACTER_SET, encoding);
		// 修改Margin
		hints.put(EncodeHintType.MARGIN, 1);

		try {
			BitMatrix bitMatrix = new MultiFormatWriter().encode(contents, BarcodeFormat.QR_CODE, width, height, hints);
			MatrixToImageWriter.writeToFile(bitMatrix, imgType, new File(imgPath));
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}

	/**
	 * 生成二维码到PNG文件
	 * 
	 * @param contents 二维码内容
	 * @param width 最大宽度
	 * @param height 最大高度
	 * @param encoding 内容编码
	 * @param imgPath 图片路径
	 * @return
	 */
	public static boolean generateToPNG(String contents, int width, int height, String encoding, String imgPath) {
		return generateToFile(contents, width, height, encoding, "png", imgPath);
	}

	/**
	 * 生成二维码到输出流
	 * 
	 * @param contents 二维码内容
	 * @param width 最大宽度
	 * @param height 最大高度
	 * @param encoding 内容编码
	 * @param imgType 图片类型
	 * @param out 输出流
	 * @return
	 */
	public static boolean generateToStream(String contents, int width, int height, String encoding, String imgType,
			OutputStream out) {
		Map hints = new HashMap();
		// 指定纠错等级
		hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);
		// 指定编码格式
		hints.put(EncodeHintType.CHARACTER_SET, encoding);
		// 修改Margin
		hints.put(EncodeHintType.MARGIN, 1);
		try {
			BitMatrix bitMatrix = new MultiFormatWriter().encode(contents, BarcodeFormat.QR_CODE, width, height, hints);
			MatrixToImageWriter.writeToStream(bitMatrix, imgType, out);
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}

	/**
	 * 生成二维码以PNG格式输出流
	 * 
	 * @param contents 二维码内容
	 * @param width 最大宽度
	 * @param height 最大高度
	 * @param encoding 内容编码
	 * @param out 输出流
	 * @return
	 */
	public static boolean generateToStreamAsPNG(String contents, int width, int height, String encoding,
			OutputStream out) {
		return generateToStream(contents, width, height, encoding, "png", out);
	}

}
